/**
 * Date:2020年9月4日 上午11:34:50
 * Copyright (c) 2020, www.bwbroad.com All Rights Reserved
 */

package com.app.common.config;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;

import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;

/**
 * Description: 日期序列化 <br/>
 * Date:2020年9月4日 上午11:34:50 <br/>
 * 
 * @author xuejianxin https://blog.51cto.com/14787961/2527323
 */
@JsonComponent
public class DateFormatConfig {

	// 如果有特殊需要 使用JsonFormat
	// @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")
	// private LocalDateTime createTime;
	// @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")
	// private Date updateTime;

	@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
	private String pattern;

	@Value("${spring.jackson.time-zone:GTM+8}")
	private String timeZone;
	
	@Bean
	public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilder() {

		return builder -> {
			TimeZone tz = TimeZone.getTimeZone(timeZone);
			DateFormat df = new SimpleDateFormat(pattern);
			df.setTimeZone(tz);
			builder.failOnEmptyBeans(false).failOnUnknownProperties(false)
					.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).dateFormat(df);
		};
	}

	@Bean
	public LocalDateTimeSerializer localDateTimeDeserializer() {
		return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
	}

	@Bean
	public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
		return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
	}
}
